package com.hjl.param;

import com.hjl.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.management.ValueExp;
import java.util.List;

/**
 * @author ServivE
 * @version 0.1
 * @className ParamController
 * @description
 * @date 2024/8/10 17:10
 * @since jdk11
 */
@Controller
@RequestMapping("param")
public class ParamController {
    /**
     * param参数接收
     */
    //1.直接接受前端传来的值  方法参数名和前端传来的参数名相同即可  不传递不报错
    //前端请求URL:localhost:8080/param/data?name=root&age=18
    @RequestMapping("data")//对外访问的地址，用来向handlerMapping中注册
    @ResponseBody//直接响应给前端 不用找视图解析器
    public String data(String name, int age) {
        System.out.println("name=" + name + ",age=" + age);
        //响应给前端
        return "name=" + name + ",age=" + age;
    }

//    2.@RequestParam注解
    //前端请求URL： http://localhost:8080/param/data1?account=root&page=2

    /**
     * @RequestParam -> 形参列表 指定请求参数名或者 是否必须传递 或者非必须传递设置默认值
     * 用法:@RequestParam(value="指定请求参数名,如果形参名和请求参数名一致，可以省略!”
     * required=false 前端是否必须传递此参数，默认是必须true，不传400异常!
     * defaultValue =“1” 当非必须传递 false，可以设置默认值)
     */
    @GetMapping("data1")
    @ResponseBody
    public String data1(@RequestParam(value = "account") String username,
                        @RequestParam(required = false, defaultValue = "1") int page) {
        System.out.println("account=" + username + ",page=" + page);
        return "account=" + username + ",page=" + page;
    }

    //3.特殊场景接值

    /**
     * 前端请求: http://localhost:8080/param/mul?hbs=吃&hbs=喝
     * <p>
     * 一名多值,可以使用集合接收即可!但是需要使用@RequestParam注解指定
     */
    @GetMapping("mul")
    @ResponseBody
    public Object data2(@RequestParam List<String> hbs) {
        System.out.println(hbs);
        return "ok";
    }

    //    实体接收 通过这种方式，可以在方法内部直接使用对象的属性来访问请求参数，而不需要每个参数都写一遍
    //将请求参数name和age映射到实体类属性上！要求属性名必须等于参数名！否则无法映射
    //localhost:8080/param/data3?name=张三&age=18
    @RequestMapping(value = "user", method = RequestMethod.GET)
    @ResponseBody
    public String data3(User user) {
        System.out.println(user.getName() + " " + user.getAge());
        return "ok";
    }
}
